/**
  ******************************************************************************
  * @file    SCK_RxData.c
  * @author  exatron
  * @version V1.0.0
  * @date    segunda, 22 de dezembro de 2014
  * @brief   Função para puxar dados do socket.
  ******************************************************************************
  * @attention
  *
  *
  ******************************************************************************
  */

/** @addtogroup SCK
  * @{
  */

/* Includes ------------------------------------------------------------------*/
#include <common.h>

extern Socket_t sock[N_SOCKS];

extern FIFO_t isrx_fifo;

/* External functions --------------------------------------------------------*/

/** @defgroup SCK_Functions
  * @{
  */

/**
  * @brief  Função para puxar dados do socket.
  * @param  SocketID_t: Socket puxar os dados
  * @retval Devolve pela serial os dados ou Result_t
  */
void SCK_RxData(SocketID_t id)
{
	#ifdef DEBUG
	debug_append("%s - %s", __FUNCTION__, "enter");
	#endif

	int nr=0, i=0, temp_id=0;
	char temp_buf[PIC_BUF_LEN];
	char isrx_buf[N_SOCKS];

	bzero(temp_buf, sizeof(temp_buf));

	/* Verifica se o socket esta aberto */
	if(sock[id].status == Status_SocketClosed)
	{
		aux_USART1_puts("%s=%d;%d\r\n", "SCK_RXD", id, Result_SocketClosed);
	}
	/* Verifica se há dados a serem lidos */
	else if(sock[id].isrx == NoRead)
	{
		aux_USART1_puts("%s=%d;%d\r\n", "SCK_RXD", id, Result_NoData);
	}
	else
	{
		nr = fifo_read(&sock[id].fifo_rx, temp_buf, PIC_BUF_LEN);

		/* Plota os dados */
		aux_USART1_puts("%s=%d;%d;%d;", "SCK_RXD", sock[id].ID, Result_Ok, nr);
		aux_USART1_putc(temp_buf, nr);

		/* Se esvaziou retira o ID da fila */
		if(fifo_isempty(&sock[id].fifo_rx) == FIFO_ISEMPTY)
		{
			sock[id].isrx = NoRead;

			/* Limpa Rx da FIFO */
			nr = fifo_read(&isrx_fifo, isrx_buf, N_SOCKS);
			for(i=0; i<nr; i++)
			{
				temp_id = isrx_buf[i];
				if(temp_id != id)
					fifo_write(&isrx_fifo, &temp_id, 1);
			}
		}
		/* Se não esvaziou coloca pro fim */
		else
		{
			nr = fifo_read(&isrx_fifo, isrx_buf, N_SOCKS);
			for(i=0; i<nr; i++)
			{
				temp_id = isrx_buf[i];
				if(temp_id != id)
					fifo_write(&isrx_fifo, &temp_id, 1);
			}
			fifo_write(&isrx_fifo, &id, 1);
		}
	}

	aux_SetBusy(FALSE);

	#ifdef DEBUG
	debug_append("%s - %s", __FUNCTION__, "exit");
	#endif
}

/**
  * @}
  */

/**
  * @}
  */




